const Comment = require('../models/comments')
class CommentCtl {
    // 查询评论
    async find(ctx) {
        const { per_page = 10 } = ctx.query
        const page = Math.max(ctx.query.page * 1, 1) - 1 // 第几页
        const perPage = Math.max(per_page * 1, 1) // 每页有几条
        // skip 跳过前面的n条数据
        const q = new RegExp(ctx.query.q)
        const { questionId, answerId } = ctx.params
        const { rootCommentId } = ctx.query
        ctx.body = await Comment
            .find({ content: q, questionId, answerId, rootCommentId })
            .limit(perPage)
            .skip(page * perPage)
            .populate('commentator replyTo')
    }
    // 查询特定评论
    async findById(ctx) {
        const { fields = '' } = ctx.query
        const selectFields = fields.split(';').filter(f => f).map(f => '+' + f).join(' ')
        const comment = await Comment.findById(ctx.params.id).select(selectFields).populate('commentator')
        ctx.body = comment
    }
    // 新建评论
    async create(ctx) {
        ctx.verifyParams({
            content: { type: 'string', required: true },
            rootCommentId: { type: 'string', required: false },
            replyTo: { type: 'string', required: false },
        })
        const commentator = ctx.state.user._id
        const { questionId, answerId } = ctx.params
        const comment = await new Comment({ ...ctx.request.body, commentator, questionId, answerId }).save()
        ctx.body = comment
    }
    // 修改评论
    async update(ctx) {
        ctx.verifyParams({
            content: { type: 'string', required: false },
        })
        const { content } = ctx.request.body
        // 只能修改content
        const comment = await Comment.findByIdAndUpdate(ctx.params.id, { content })
        ctx.body = comment
    }
    // 检查评论是否存在
    async checkCommentExist(ctx, next) {
        const comment = await Comment.findById(ctx.params.id).select('+commentator')
        if (!comment) { ctx.throw(404, '评论不存在') }
        // 只有在路由里面包含questionId，只有在删改查评论时候才检查此逻辑，赞、踩评论时候不检查
        if (ctx.params.questionId && comment.questionId !== ctx.params.questionId) {
            ctx.throw(404, '该问题下没有此评论')
        }
        if (ctx.params.answerId && comment.answerId !== ctx.params.answerId) {
            ctx.throw(404, '该答案下没有此评论')
        }
        // 与update共用findById
        ctx.state.comment = comment
        await next()
    }
    // 检查当前登录者是否是提出该评论的人
    async checkCommentator(ctx, next) {
        const { comment } = ctx.state
        if (comment.commentator.toString() !== ctx.state.user._id) {
            ctx.throw(403, '没有权限')
        }
        await next()
    }
    async delete(ctx) {
        await Comment.findByIdAndRemove(ctx.params.id)
        ctx.status = 204
    }
}

module.exports = new CommentCtl()
